home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / share / hplip / probe.py < prev    next >
Text File  |  2008-10-13  |  10KB  |  297 lines

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. #
  4. # (c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
  5. #
  6. # This program is free software; you can redistribute it and/or modify
  7. # it under the terms of the GNU General Public License as published by
  8. # the Free Software Foundation; either version 2 of the License, or
  9. # (at your option) any later version.
  10. #
  11. # This program is distributed in the hope that it will be useful,
  12. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. # GNU General Public License for more details.
  15. #
  16. # You should have received a copy of the GNU General Public License
  17. # along with this program; if not, write to the Free Software
  18. # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  19. #
  20. # Author: Don Welch
  21. #
  22.  
  23.  
  24. __version__ = '4.1'
  25. __title__ = 'Printer Discovery Utility'
  26. __doc__ = "Discover USB, parallel, and network printers."
  27.  
  28.  
  29. # Std Lib
  30. import sys
  31. import getopt
  32. import operator
  33. import os
  34.  
  35. # Local
  36. from base.g import *
  37. from base import device, utils, tui
  38.  
  39.  
  40. USAGE = [(__doc__, "", "name", True),
  41.          ("Usage: hp-probe [OPTIONS]", "", "summary", True),
  42.          utils.USAGE_OPTIONS,
  43.          ("Bus to probe:", "-b<bus> or --bus=<bus>", "option", False),
  44.          ("", "<bus>: cups, usb\*, net, bt, fw, par (\*default) (Note: bt and fw not supported in this release.)", "option", False),
  45.          ("Set Time to Live (TTL):", "-t<ttl> or --ttl=<ttl> (Default is 4).", "option", False),
  46.          ("Set timeout:", "-o<timeout in secs.> or --timeout=<timeout is secs.>", "option", False),
  47.          ("Filter by functionality:", "-e<filter list> or --filter=<filter list>", "option", False),
  48.          ("", "<filter list>: comma separated list of one or more of: scan, pcard, fax, copy, or none\*. (\*none is the default)", "option", False),
  49.          ("Search:", "-s<search re> or --search=<search re>", "option", False),
  50.          ("", "<search re> must be a valid regular expression (not case sensitive)", "option", False),
  51.          ("Network discovery method:", "-m<method> or --method=<method>: <method> is 'slp'* or 'mdns'.", "option", False),
  52.          utils.USAGE_LOGGING1, utils.USAGE_LOGGING2, utils.USAGE_LOGGING3,
  53.          utils.USAGE_HELP,
  54.          utils.USAGE_SPACE,
  55.          utils.USAGE_EXAMPLES,
  56.          ("Find all devices on the network:", "hp-probe -bnet", "example", False),
  57.          ("Find all devices on USB that support scanning:", "hp-probe -busb -escan", "example", False),
  58.          ("Find all networked devices that contain the name 'lnx' and that support photo cards or scanning:", "hp-probe -bnet -slnx -escan,pcard", "example", False),
  59.          ("Find all devices that have queues installed in CUPS:", "hp-probe -bcups", "example", False),
  60.          ("Find all devices on the USB bus:", "hp-probe", "example", False),
  61.          ]
  62.  
  63. def usage(typ='text'):
  64.     if typ == 'text':
  65.         utils.log_title(__title__, __version__)
  66.  
  67.     utils.format_text(USAGE, typ, __title__, 'hp-probe', __version__)
  68.     sys.exit(0)
  69.  
  70.  
  71. log.set_module('hp-probe')
  72.  
  73. try:
  74.  
  75.     try:
  76.         opts, args = getopt.getopt(sys.argv[1:],
  77.                                     'hl:b:t:o:e:s:gm:',
  78.                                     ['help', 'help-rest', 'help-man',
  79.                                       'help-desc',
  80.                                       'logging=',
  81.                                       'bus=',
  82.                                       'event=',
  83.                                       'ttl=',
  84.                                       'timeout=',
  85.                                       'filter=',
  86.                                       'search=',
  87.                                       'method=',
  88.                                     ]
  89.                                   )
  90.     except getopt.GetoptError, e:
  91.         log.error(e.msg)
  92.         usage()
  93.  
  94.     log_level = logger.DEFAULT_LOG_LEVEL
  95.     bus = None
  96.     align_debug = False
  97.     timeout=10
  98.     ttl=4
  99.     filter = []
  100.     search = ''
  101.     method = 'slp'
  102.  
  103.     if os.getenv("HPLIP_DEBUG"):
  104.         log.set_level('debug')
  105.  
  106.     for o, a in opts:
  107.  
  108.         if o in ('-h', '--help'):
  109.             usage()
  110.  
  111.         elif o == '--help-rest':
  112.             usage('rest')
  113.  
  114.         elif o == '--help-man':
  115.             usage('man')
  116.  
  117.         elif o == '--help-desc':
  118.             print __doc__,
  119.             sys.exit(0)
  120.  
  121.         elif o == '-g':
  122.             log.set_level('debug')
  123.  
  124.         elif o in ('-b', '--bus'):
  125.             try:
  126.                 bus = [x.lower().strip() for x in a.split(',')]
  127.             except TypeError:
  128.                 bus = ['usb']
  129.  
  130.             if not device.validateBusList(bus):
  131.                 usage()
  132.  
  133.         elif o in ('-l', '--logging'):
  134.             log_level = a.lower().strip()
  135.             if not log.set_level(log_level):
  136.                 usage()
  137.  
  138.         elif o in ('-m', '--method'):
  139.             method = a.lower().strip()
  140.  
  141.             if method not in ('slp', 'mdns', 'bonjour'):
  142.                 log.error("Invalid network search protocol: %s (must be 'slp' or 'mdns')" % method)
  143.                 method = 'slp'
  144.  
  145.             else:
  146.                 bus = ['net']
  147.  
  148.         elif o in ('-t', '--ttl'):
  149.             try:
  150.                 ttl = int(a)
  151.             except ValueError:
  152.                 ttl = 4
  153.                 log.note("TTL value error. TTL set to default of 4 hops.")
  154.  
  155.         elif o in ('-o', '--timeout'):
  156.             try:
  157.                 timeout = int(a)
  158.                 if timeout > 45:
  159.                     log.note("Timeout > 45secs. Setting to 45secs.")
  160.                     timeout = 45
  161.             except ValueError:
  162.                 timeout = 5
  163.                 log.note("Timeout value error. Timeout set to default of 5secs.")
  164.  
  165.             if timeout < 0:
  166.                 log.error("You must specify a positive timeout in seconds.")
  167.                 usage()
  168.  
  169.         elif o in ('-e', '--filter'):
  170.             filter = [x.strip().lower() for x in a.split(',')]
  171.             if not device.validateFilterList(filter):
  172.                 usage()
  173.  
  174.         elif o in ('-s', '--search'):
  175.             search = a.lower().strip()
  176.  
  177.     utils.log_title(__title__, __version__)
  178.     
  179.     if os.getuid() == 0:
  180.         log.warn("hp-probe should not be run as root.")
  181.  
  182.     if bus is None:
  183.         x = 1
  184.         ios = {0: ('usb', "Universal Serial Bus (USB)") }
  185.         if sys_cfg.configure['network-build']: 
  186.             ios[x] = ('net', "Network/Ethernet/Wireless (direct connection or JetDirect)")
  187.             x += 1
  188.         if sys_cfg.configure['pp-build']: 
  189.             ios[x] = ('par', "Parallel Port (LPT:)")
  190.             x += 1
  191.         
  192.         if len(ios) > 1:
  193.             tui.header("CHOOSE CONNECTION TYPE")
  194.             f = tui.Formatter()
  195.             f.max_widths = (10, 10, 40)
  196.             f.header = ("Num.", "Connection Type", "Connection Type Description")
  197.             
  198.             for x, data in ios.items():
  199.                 if not x:
  200.                     f.add((str(x) + "*", data[0], data[1]))
  201.                 else:
  202.                     f.add((str(x), data[0], data[1]))
  203.                 
  204.             f.output()
  205.         
  206.             ok, val = tui.enter_range("\nEnter number 0...%d for connection type (q=quit, enter=usb*) ? " % x, 
  207.                 0, x, 0)
  208.  
  209.             if not ok: sys.exit(0)
  210.             
  211.             bus = [ios[val][0]]
  212.         else:
  213.             bus = [ios[0][0]]
  214.             
  215.         log.info("")
  216.         
  217.     tui.header("DEVICE DISCOVERY")
  218.  
  219.     for b in bus:
  220.         if b == 'net':
  221.             log.info(log.bold("Probing network for printers. Please wait, this will take approx. %d seconds...\n" % timeout))
  222.             
  223.         FILTER_MAP = {'print' : None,
  224.                       'none' : None,
  225.                       'scan': 'scan-type', 
  226.                       'copy': 'copy-type', 
  227.                       'pcard': 'pcard-type',
  228.                       'fax': 'fax-type',
  229.                       }
  230.         
  231.         filter_dict = {}
  232.         for f in filter:
  233.             if f in FILTER_MAP:
  234.                 filter_dict[FILTER_MAP[f]] = (operator.gt, 0)
  235.             else:
  236.                 filter_dict[f] = (operator.gt, 0)
  237.                 
  238.         log.debug(filter_dict)
  239.  
  240.         devices = device.probeDevices([b], timeout, ttl, filter_dict, search, method)
  241.         cleanup_spinner()
  242.  
  243.         max_c1, max_c2, max_c3, max_c4 = 0, 0, 0, 0
  244.  
  245.         if devices:
  246.             for d in devices:
  247.                 max_c1 = max(len(d), max_c1)
  248.                 max_c3 = max(len(devices[d][0]), max_c3)
  249.                 max_c4 = max(len(devices[d][2]), max_c4)
  250.  
  251.             if b == 'net':
  252.                 formatter = utils.TextFormatter(
  253.                             (
  254.                                 {'width': max_c1, 'margin' : 2},
  255.                                 {'width': max_c3, 'margin' : 2},
  256.                                 {'width': max_c4, 'margin' : 2},
  257.                             )
  258.                         )
  259.  
  260.                 log.info(formatter.compose(("Device URI", "Model", "Name")))
  261.                 log.info(formatter.compose(('-'*max_c1, '-'*max_c3, '-'*max_c4)))
  262.                 for d in devices:
  263.                     log.info(formatter.compose((d, devices[d][0], devices[d][2])))
  264.  
  265.             elif b in ('usb', 'par', 'cups'):
  266.                 formatter = utils.TextFormatter(
  267.                             (
  268.                                 {'width': max_c1, 'margin' : 2},
  269.                                 {'width': max_c3, 'margin' : 2},
  270.                             )
  271.                         )
  272.  
  273.                 log.info(formatter.compose(("Device URI", "Model")))
  274.                 log.info(formatter.compose(('-'*max_c1, '-'*max_c3)))
  275.                 for d in devices:
  276.                     log.info(formatter.compose((d, devices[d][0])))
  277.  
  278.             else:
  279.                 log.error("Invalid bus: %s" % b)
  280.  
  281.             log.info("\nFound %d printer(s) on the '%s' bus.\n" % (len(devices), b))
  282.  
  283.         else:
  284.             log.warn("No devices found on the '%s' bus. If this isn't the result you are expecting," % b)
  285.  
  286.             if b == 'net':
  287.                 log.warn("check your network connections and make sure your internet")
  288.                 log.warn("firewall software is disabled.")
  289.             else:
  290.                 log.warn("check to make sure your devices are properly connected and powered on.")
  291.  
  292. except KeyboardInterrupt:
  293.     log.error("User exit")
  294.  
  295. log.info("")
  296. log.info("Done.")
  297.